package com.xpffly.design.builder;

import com.xpffly.design.builder.builder.impl.BenzBuilder;
import com.xpffly.design.builder.builder.impl.BmBuilder;
import com.xpffly.design.builder.model.impl.BenzModel;
import com.xpffly.design.builder.model.impl.BmModel;

import java.util.ArrayList;

/**
 * @Author: xpengfei
 * @Date: 2021/3/29 0:04
 * @Description：导演类 负责安排已有模块的顺序，然后告诉Builder开始建造（即负责各种场景下模型的创建）
 */
public class Director {

    /**
     * 用于临时存放模型组装顺序
     */
    private ArrayList<String> sequence = new ArrayList<String>();
    /**
     * 奔驰车建造者
     */
    private BenzBuilder benzBuilder = new BenzBuilder();
    /**
     * 宝马车建造者
     */
    private BmBuilder bmBuilder = new BmBuilder();

    /**
     * 奔驰A模型，先start，然后stop
     *
     * @return
     */
    public BenzModel getBenzModelA() {
        // 清理场景
        this.sequence.clear();
        // A 模型的执行顺序
        this.sequence.add("start");
        this.sequence.add("stop");

        // 奔驰建造者创建对应的模型
        this.benzBuilder.setSequence(this.sequence);
        return (BenzModel) this.benzBuilder.getCarModel();
    }

    /**
     * 奔驰B模型，先发动引擎，之后start，然后stop
     *
     * @return
     */
    public BenzModel getBenzModelB() {
        // 清理场景
        this.sequence.clear();
        // A 模型的执行顺序
        this.sequence.add("engine boom");
        this.sequence.add("start");
        this.sequence.add("stop");

        // 奔驰建造者创建对应的模型
        this.benzBuilder.setSequence(this.sequence);
        return (BenzModel) this.benzBuilder.getCarModel();
    }

    /**
     * 宝马A模型，先鸣笛，之后启动，然后停止
     *
     * @return
     */
    public BmModel getBmModelA() {
        // 清理场景
        this.sequence.clear();
        // A 模型的执行顺序
        this.sequence.add("alarm");
        this.sequence.add("start");
        this.sequence.add("stop");

        // 宝马建造者创建对应的模型
        this.bmBuilder.setSequence(this.sequence);
        return (BmModel) this.bmBuilder.getCarModel();
    }

    /**
     * 宝马B模型，只有一个功能：跑
     *
     * @return
     */
    public BmModel getBmModelB() {
        // 清理场景
        this.sequence.clear();
        // B 模型的执行顺序
        this.sequence.add("start");
        // 宝马建造者创建对应的模型
        this.bmBuilder.setSequence(this.sequence);
        return (BmModel) this.bmBuilder.getCarModel();
    }

}


